
package br.com.lm.view;

import br.com.lm.base.eao.EaoException;
import br.com.lm.geral.util.Constantes;
import br.com.lm.geral.util.GerenciamentoLoginBean;
import br.com.lm.geral.util.MessageProvider;
import br.com.lm.geral.util.MsgCtrlBean;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIInput;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.context.RequestContext;
import org.primefaces.push.PushContext;
import org.primefaces.push.PushContextFactory;

public class LoginBean implements Serializable {

    private static final long serialVersionUID = 1L;
    
    //Internacionalizacao
    private static final String LOGIN_RESOURCE_BUNDLE_VAR  = "msgLogin";
    private static final String SYSTEM_RESOURCE_BUNDLE_VAR = "msgPool";
    private MessageProvider messageProvider; 
    private String resourceBundleVar;

    //Validacao de Login
    private GerenciamentoLoginBean ctrlAtualizacaoLogin;
    
    //Area de input/output com pagina de login.jsf
    private String username;
    private String nomUser;   
    
    private String password;
    private String newPassword;
    private String confirmPassword;
    
    //Extensao de funcionalidades
    public HttpSession session;
    private int alturaTela;
    private int larguraTela;
    
    //Getter's e Setter's publicos
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getNewPassword() {
        return newPassword;
    }

    public void setNewPassword(String newPassword) {
        this.newPassword = newPassword;
    }

    public String getConfirmPassword() {
        return confirmPassword;
    }

    public void setConfirmPassword(String confirmPassword) {
        this.confirmPassword = confirmPassword;
    }
    
    public String getNomUser() {
        return nomUser;
    }

    public void setNomUser(String nomUser) {
        this.nomUser = nomUser;
    }

    public int getAlturaTela() {
        return alturaTela;
    }

    public void setAlturaTela(int alturaTela) {
        this.alturaTela = alturaTela;
    }

    public int getLarguraTela() {
        return larguraTela;
    }

    public void setLarguraTela(int larguraTela) {
        this.larguraTela = larguraTela;
    }

    /* -----------------------------------------------------------------------
     * Valida o login informado na pagina login.jsf
     * ---------------------------------------------------------------------- */
    public void login() throws EaoException {         
        //Obtem a largura e a altura para definicao da tela
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        final Dimension scrnsize = toolkit.getScreenSize();
        this.alturaTela = (int) scrnsize.getHeight();
        this.larguraTela = (int) scrnsize.getWidth();

        //Controle erro usado em Java Script da pagina login.jsf para fechar animacao
        //<p:socket onMessage="socketNotificationsMessages" channel="/notifications" />
        boolean socketNotificationsMessages_JS = true;    
        
        //Valida Login (Usuario/Senha)
        ctrlAtualizacaoLogin = new GerenciamentoLoginBean();       
        FacesMessage msg = ctrlAtualizacaoLogin.validaLogin(username, password);
        
        if (msg == null) {
            //Nome do usuario fornecido no login
            nomUser = ctrlAtualizacaoLogin.getUsuarioAutenticado().getNomUsuario();
            
            //1) Salva dados de sessão: Usuario autenticado e Objetos de acesso de perfil
            //2) Transfere o controle para /home.jsf se sucesso
            msg = ctrlAtualizacaoLogin.sucessoLogin(true, true);
            if (msg == null) {
                //Grava dados adicionais de sessao
                gravaDadosAdicionaisSessao();
                //Em caso de sucesso, desabilita a execucao do Java Script  
                socketNotificationsMessages_JS = false; 
                //Gera mensagem: Bem Vindo LM - Condominios para Growl
                resourceBundleVar = SYSTEM_RESOURCE_BUNDLE_VAR;
                //msg = new FacesMessage(FacesMessage.SEVERITY_INFO, getNomUser(), getMessageI18N("geral.I001"));
            }
        } 
        //Global Messages
        FacesContext.getCurrentInstance().addMessage(null, msg);

        //Em caso de Erro/Warning fecha animacao da pagina de Login
        if (socketNotificationsMessages_JS) {
            //Valor passado para Socket.channel e processado pelo JavaScript 
            //Pode-se passar FacesMessage se desejar: pushContext.push("/notifications", msg)
            PushContext pushContext = PushContextFactory.getDefault().getPushContext();
            pushContext.push("/notifications", null); 
        }
    }

    /* -----------------------------------------------------------------------
     * Alteracao de Senha
     * ---------------------------------------------------------------------- */    
    public void alteraSenha() throws EaoException {
        
        //Consiste campos da pagina login.jsf
        boolean isOk = validaAlteracaoSenha();  
        
        if (isOk) {
            FacesMessage msg;
            
            //Verifica se o Usuario esta autenticado 
            if (ctrlAtualizacaoLogin == null || ctrlAtualizacaoLogin.getUsuarioAutenticado() == null) {
                ctrlAtualizacaoLogin = new GerenciamentoLoginBean();       
                msg = ctrlAtualizacaoLogin.validaLogin(username, password);
                if (msg == null) {
                    //Efetiva alteracao de senhas
                    ctrlAtualizacaoLogin.alteraSenhaAntigaParaNovaSenha(newPassword);
                } 
            }           
             else {
                //Efetiva alteracao de senhas
                msg = ctrlAtualizacaoLogin.alteraSenhaAntigaParaNovaSenha(newPassword);
            }
            
            //Analisa o retorna da alteracao de senhas
            isOk = (msg == null || msg.getSeverity().equals(FacesMessage.SEVERITY_INFO)); 
            
            //Nome do usuario autenticado
            if (isOk)
               nomUser = ctrlAtualizacaoLogin.getUsuarioAutenticado().getNomUsuario();
            
            //Global Messages
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }    
        //Notifica o java script evento: "oncomplete="checkAlteracaoSenha(xhr, status, args)"
        //Passa o valor booleano true=Sucesso ou false=Erro
        RequestContext context = RequestContext.getCurrentInstance();  
        context.addCallbackParam("loggedIn", isOk);  
    }

    /* -----------------------------------------------------------------------
     * Encerra a sessao com a pagina de Login
     * ---------------------------------------------------------------------- */            
    public String encerraSessao() {
        try {
            FacesContext ctx = FacesContext.getCurrentInstance();
            session = (HttpSession) ctx.getExternalContext().getSession(false);
            ctx.getExternalContext().redirect(ctx.getExternalContext().getRequestContextPath() + Constantes.PAGINA_INDEX);
            session.invalidate();
        } catch (Exception e) {
        }
        return null;
    }
    
    /* -----------------------------------------------------------------------
     * Grava dados de Sessão 
     * ---------------------------------------------------------------------- */
    private void gravaDadosAdicionaisSessao () {        
        try {
            if (alturaTela != 0 || larguraTela != 0) {
                FacesContext ctx = FacesContext.getCurrentInstance();
                session = (HttpSession) ctx.getExternalContext().getSession(true);
                session.setAttribute("alturaTela", alturaTela);
                session.setAttribute("larguraTela",larguraTela);
            }
        } catch (Exception e) {
            //Erro de Sistema... Analisar Log do Servidor!
            System.out.println("Erro LoginBean(sucessoLogin): " + e.getLocalizedMessage());
       }
    }
         
    /* -----------------------------------------------------------------------
     * Valida campos obrigatorios para o Panel de Alteracao de Senha
     * ---------------------------------------------------------------------- */                            
    private boolean validaAlteracaoSenha() {
        resourceBundleVar = LOGIN_RESOURCE_BUNDLE_VAR;
        FacesMessage msg = null;
        boolean isOk = true;
        
        UIViewRoot uiv = FacesContext.getCurrentInstance().getViewRoot();
        UIInput uii;
        String mensagem;
        
        if (password == null || password.trim().equals("")) {
            mensagem = MsgCtrlBean.getMessageFrmt(getMessageI18N("E003"), new String[]{getMessageI18N("I018")});
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, null, mensagem);
            FacesContext.getCurrentInstance().addMessage("loginForm:senhavelha", msg);
            uii = (UIInput) uiv.findComponent("loginForm:senhavelha");
            uii.setValid(false);
            isOk = false;            
        }    
        
        if (newPassword == null || newPassword.trim().equals("")) {
            mensagem = MsgCtrlBean.getMessageFrmt(getMessageI18N("E003"), new String[]{getMessageI18N("I014")});
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, null, mensagem);
            FacesContext.getCurrentInstance().addMessage("loginForm:senhanova", msg);
            uii = (UIInput) uiv.findComponent("loginForm:senhanova");
            uii.setValid(false);
            isOk = false;
        }
        
        if (confirmPassword == null || confirmPassword.trim().equals("")) {
            mensagem = MsgCtrlBean.getMessageFrmt(getMessageI18N("E003"), new String[]{getMessageI18N("I015")});
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, null, mensagem);
            FacesContext.getCurrentInstance().addMessage("loginForm:confsenha", msg);
            uii = (UIInput) uiv.findComponent("loginForm:confsenha");
            uii.setValid(false);
            isOk = false;
        }
        
        if (msg == null && !newPassword.equals(confirmPassword)) {
            mensagem = MsgCtrlBean.getMessageFrmt(getMessageI18N("E004"), 
                       new String[]{getMessageI18N("I014"),getMessageI18N("I015")});
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, null, mensagem);
            FacesContext.getCurrentInstance().addMessage("loginForm:messagesDialog", msg);
            uii = (UIInput) uiv.findComponent("loginForm:senhanova");
            uii.setValid(false);            
            uii = (UIInput) uiv.findComponent("loginForm:confsenha");
            uii.setValid(false); 
            isOk = false;
        }  
        return isOk;
    }
    
    /* -----------------------------------------------------------------------
     * Obtem a descricao da mensagem usando Internacionalizacao I18N
     * ---------------------------------------------------------------------- */                                
    private String getMessageI18N(String chaveMsg) {
        if (messageProvider == null  || !resourceBundleVar.equals(messageProvider.getResourceBundleVar()))
            messageProvider = new MessageProvider(resourceBundleVar);
        return messageProvider.getValueFromKey(chaveMsg);
    }
    
}